﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Sinacor.UI.Bovespa.ManutencaoOrdens.Presenter;
using Sinacor.Infra.UI.Controls.SmartClient;
using Sinacor.Infra.UI.Common;
using PSE.Framework.Threading;
using System.Threading;

namespace Sinacor.UI.Bovespa.ManutencaoOrdens.View.SmartClient
{
    public partial class CasamentoAutomatico : SinacorWindow, ICasamentoAutomatico
    {
        #region Campos
        private string _apresentaMensagem;
        private ExecutionQueue _exec = new ExecutionQueue();
        #endregion Campos

        #region Presenter
        /// <summary>
        /// Casamento Automático
        /// </summary>
        public Presenter.CasamentoAutomatico _presenter { get; set; }
        #endregion

        #region Construtor
        /// <summary>
        /// CasamentoAutomatico
        /// </summary>
        public CasamentoAutomatico()
        {
            InitializeComponent();

            this._presenter = new Presenter.CasamentoAutomatico(this);
            this.DataContext = this._presenter;
            this.AfterInitialize += new RoutedEventHandler(CasamentoAutomatico_AfterInitialize);
            this.Closed += new EventHandler(CasamentoAutomatico_Closed);
        }

        void CasamentoAutomatico_Closed(object sender, EventArgs e)
        {
            this._presenter.Dispose();
        }

        #endregion

        #region ICasamentoAutomatico Members

        #region ApresentarCasamentoAut
        /// <summary>
        /// ApresentarCasamentoAut
        /// </summary>
        public void ApresentarCasamentoAut()
        {
            if (GrdCasamentoAutomatico != null && GrdCasamentoAutomaticoPreBoleto != null && GrdRecasamentoAutomatico != null)
            {
                GrdCasamentoAutomaticoPreBoleto.Visibility = Visibility.Hidden;
                GrdRecasamentoAutomatico.Visibility = Visibility.Hidden;
                GrdCasamentoAutomatico.Visibility = Visibility.Visible;
                //SinacorMessageBox.Show(FindResource("Bovespa.ManutencaoOrdens.Message.CasamentoAutomáticoAlerta2").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);  
            }
        }
        #endregion ApresentarCasamentoAut
        #region ApresentarCasamentoAutPreBoleto
        /// <summary>
        /// ApresentarCasamentoAutPreBoleto
        /// </summary>
        public void ApresentarCasamentoAutPreBoleto()
        {
            if (GrdCasamentoAutomatico != null && GrdCasamentoAutomaticoPreBoleto != null && GrdRecasamentoAutomatico != null)
            {
                GrdCasamentoAutomatico.Visibility = Visibility.Hidden;
                GrdRecasamentoAutomatico.Visibility = Visibility.Hidden;
                GrdCasamentoAutomaticoPreBoleto.Visibility = Visibility.Visible;
                //LblCasamentoAutomaticoPreBoleto.Content = FindResource("Bovespa.ManutencaoOrdens.Message.CasamentoAutomáticoAlerta1");  
            }
        }
        #endregion ApresentarCasamentoAutPreBoleto
        #region ApresentarRecasamentoAut
        /// <summary>
        /// ApresentarRecasamentoAut
        /// </summary>
        public void ApresentarRecasamentoAut()
        {
            if (GrdCasamentoAutomatico != null && GrdCasamentoAutomaticoPreBoleto != null && GrdRecasamentoAutomatico != null)
            {
                GrdCasamentoAutomatico.Visibility = Visibility.Hidden;
                GrdCasamentoAutomaticoPreBoleto.Visibility = Visibility.Hidden;
                GrdRecasamentoAutomatico.Visibility = Visibility.Visible;
                //SinacorMessageBox.Show(FindResource("Bovespa.ManutencaoOrdens.Message.CasamentoAutomáticoAlerta3").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);  
            }
        }
        #endregion ApresentarRecasamentoAut

        #region AtualizarCalendario
        /// <summary>
        /// Atualiza combobox de calendário
        /// </summary>
        public void AtualizarCalendario()
        {
            this.CmbDataMovimento.ItemsSource = _presenter.Calendario;
            this.CmbDataMovimento.UpdateTarget(SinacorComboBox.SelectedValueProperty);
        }
        #endregion AtualizarCalendario

        #region ConfirmarCasamentoAut
        /// <summary>
        /// ConfirmarCasamentoAut
        /// </summary>
        /// <returns>bool</returns>
        public bool ConfirmarCasamentoAut()
        {
            _apresentaMensagem = string.Format(FindResource("Bovespa.ManutencaoOrdens.Message.ExecucaoCasamentoAutomatico").ToString(),
                                               FindResource("Bovespa.ManutencaoOrdens.Message.CasamentoAutomatico").ToString());

            SinacorMessageBoxResult result = SinacorMessageBox.Show(_apresentaMensagem, SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }
        #endregion ConfirmarCasamentoAut
        #region ConfirmarCasamentoAutPreBoleto
        /// <summary>
        /// ConfirmarCasamentoAutPreBoleto
        /// </summary>
        /// <returns>bool</returns>
        public bool ConfirmarCasamentoAutPreBoleto()
        {
            _apresentaMensagem = string.Format(FindResource("Bovespa.ManutencaoOrdens.Message.ExecucaoCasamentoAutomatico").ToString(),
                                               FindResource("Bovespa.ManutencaoOrdens.Message.CasamentoAutomaticoPreBoleto").ToString());

            SinacorMessageBoxResult result = SinacorMessageBox.Show(_apresentaMensagem, SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }
        #endregion ConfirmarCasamentoAutPreBoleto
        #region ConfirmarRecasamentoAut
        /// <summary>
        /// ConfirmarRecasamentoAut
        /// </summary>
        /// <returns>bool</returns>
        public bool ConfirmarRecasamentoAut()
        {
            _apresentaMensagem = string.Format(FindResource("Bovespa.ManutencaoOrdens.Message.ExecucaoCasamentoAutomatico").ToString(),
                                               FindResource("Bovespa.ManutencaoOrdens.Message.RecasamentoAutomatico").ToString());

            SinacorMessageBoxResult result = SinacorMessageBox.Show(_apresentaMensagem, SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Question);

            return (result == SinacorMessageBoxResult.Yes);
        }
        #endregion ConfirmarRecasamentoAut

        #region DesabilitarCasamentoAut
        /// <summary>
        /// DesabilitarCasamentoAut
        /// </summary>
        public void DesabilitarCasamentoAut()
        {
            ChkCasamentoAutomatico.IsEnabled = false; 
        }
        #endregion DesabilitarCasamentoAut
        #region DesabilitarCasamentoAutPreBoleto
        /// <summary>
        /// DesabilitarCasamentoAutPreBoleto
        /// </summary>
        public void DesabilitarCasamentoAutPreBoleto()
        {
            ChkCasamentoAutomaticoPreBoleto.IsEnabled = false;
        }
        #endregion DesabilitarCasamentoAutPreBoleto
        #region DesabilitarRecasamentoAut
        /// <summary>
        /// DesabilitarRecasamentoAut
        /// </summary>
        public void DesabilitarRecasamentoAut()
        {
            ChkRecasamentoAutomatico.IsEnabled = false;
        }
        #endregion DesabilitarRecasamentoAut

        #region DesabilitarControles
        /// <summary>
        /// DesabilitarControles
        /// </summary>
        public void DesabilitarControles()
        {
            CmbDataMovimento.IsEnabled = false;
            
            DesabilitarCasamentoAut();
            DesabilitarCasamentoAutPreBoleto();
            DesabilitarRecasamentoAut();

            BtnExecutar.IsEnabled = false;
        }
        #endregion DesabilitarControles

        #region HabilitarControles
        /// <summary>
        /// HabilitarControles
        /// </summary>
        public void HabilitarControles()
        {
            this.Dispatcher.Invoke((Action)delegate()
            {
                CmbDataMovimento.IsEnabled = true;

                ChkCasamentoAutomatico.IsEnabled =true;
                ChkCasamentoAutomaticoPreBoleto.IsEnabled = true;
                ChkRecasamentoAutomatico.IsEnabled = true;

                BtnExecutar.IsEnabled = true;
            });
        }
        #endregion HabilitarControles
        
        #region InformarOperacaoSucesso
        /// <summary>
        /// InformarOperacaoSucesso
        /// </summary>
        public void InformarOperacaoSucesso()
        {
            _exec.QueueUserWorkItem(new WaitCallback(delegate(object state)
                {
                    this.Dispatcher.Invoke((Action)delegate()
                    {
                        SinacorMessageBox.Show(this.TryFindResource("Bovespa.ManutencaoOrdens.Message.OperacaoSucesso").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
                    });
                }));
        }
        #endregion InformarOperacaoSucesso

        #region InformarProcessamentoCasamentoAut
        /// <summary>
        /// InformarProcessamentoCasamentoAut
        /// </summary>
        public void InformarProcessamentoCasamentoAut()
        {
            _exec.QueueUserWorkItem(new WaitCallback(delegate(object state)
            {

                this.Dispatcher.Invoke((Action)delegate()
                {
                    _apresentaMensagem = string.Format(FindResource("Bovespa.ManutencaoOrdens.Message.AlertaProcessoExecuntando").ToString(),
                                                   FindResource("Bovespa.ManutencaoOrdens.Message.CasamentoAutomatico").ToString());

                    SinacorMessageBox.Show(_apresentaMensagem, SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
                });
            }));
        }
        #endregion InformarProcessamentoCasamentoAut
        #region InformarProcessamentoCasamentoAutPreBoleto
        /// <summary>
        /// InformarProcessamentoCasamentoAutPreBoleto
        /// </summary>
        public void InformarProcessamentoCasamentoAutPreBoleto()
        {
            _exec.QueueUserWorkItem(new WaitCallback(delegate(object state)
               {
                   _apresentaMensagem = string.Format(FindResource("Bovespa.ManutencaoOrdens.Message.AlertaProcessoExecuntando").ToString(),
                                                      FindResource("Bovespa.ManutencaoOrdens.Message.CasamentoAutomaticoPreBoleto").ToString());

                   this.Dispatcher.Invoke((Action)delegate()
                   {
                       SinacorMessageBox.Show(_apresentaMensagem, SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
                   });
               }));
        }
        #endregion InformarProcessamentoCasamentoAutPreBoleto
        #region InformarProcessamentoRecasamentoAut
        /// <summary>
        /// InformarProcessamentoRecasamentoAut
        /// </summary>
        public void InformarProcessamentoRecasamentoAut()
        {
            _exec.QueueUserWorkItem(new WaitCallback(delegate(object state)
             {
                 _apresentaMensagem = string.Format(FindResource("Bovespa.ManutencaoOrdens.Message.AlertaProcessoExecuntando").ToString(),
                                                    FindResource("Bovespa.ManutencaoOrdens.Message.RecasamentoAutomatico").ToString());

                 this.Dispatcher.Invoke((Action)delegate()
                 {
                     SinacorMessageBox.Show(_apresentaMensagem, SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Information);
                 });
             }));
        }
        #endregion InformarProcessamentoRecasamentoAut

        #region InformarErroProcessoCasamentoAutomatico
        /// <summary>
        /// InformarErroProcessoCasamentoAutomatico
        /// </summary>
        public void InformarErroProcessoCasamentoAutomatico()
        {
            _exec.QueueUserWorkItem(new WaitCallback(delegate(object state)
             {
                 this.Dispatcher.Invoke((Action)delegate()
                 {
                     SinacorMessageBox.Show(this.TryFindResource("Bovespa.ManutencaoOrdens.ExceptionMessage.ErroInesperadoCasamentoAut").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Error);
                 });
             }));
        }
        #endregion InformarErroProcessoCasamentoAutomatico
        #region InformarErroProcessoCasamentoAutomaticoPreBoleto
        /// <summary>
        /// InformarErroProcessoCasamentoAutomaticoPreBoleto
        /// </summary>
        public void InformarErroProcessoCasamentoAutomaticoPreBoleto()
        {
            _exec.QueueUserWorkItem(new WaitCallback(delegate(object state)
             {
                 this.Dispatcher.Invoke((Action)delegate()
                 {
                     SinacorMessageBox.Show(this.TryFindResource("Bovespa.ManutencaoOrdens.ExceptionMessage.ErroCasamentoAutPreBoleto").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Error);
                 });
             }));
        }
        #endregion InformarErroProcessoCasamentoAutomaticoPreBoleto
        #region InformarErroProcessoRecasamentoAutomatico
        /// <summary>
        /// InformarErroProcessoRecasamentoAutomatico
        /// </summary>
        public void InformarErroProcessoRecasamentoAutomatico()
        {
            _exec.QueueUserWorkItem(new WaitCallback(delegate(object state)
             {
                 this.Dispatcher.Invoke((Action)delegate()
                 {
                     SinacorMessageBox.Show(this.TryFindResource("Bovespa.ManutencaoOrdens.ExceptionMessage.ErroInesperadoRecasamentoAut").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Error);
                 });
             }));
        }
        #endregion InformarErroProcessoRecasamentoAutomatico

        #endregion ICasamentoAutomatico

        #region Métodos
        #region SelecionarDataCombo
        /// <summary>
        /// SelecionarDataCombo
        /// </summary>
        private void SelecionarDataCombo()
        {
            if (CmbDataMovimento.Items.Count > 0 && this._presenter.InformacoesMovimento.DataMovimento > DateTime.MinValue)
            {
                CmbDataMovimento.SelectedValue = _presenter.InformacoesMovimento.DataMovimento.ToShortDateString();
            }
        }
        #endregion SelecionarDataCombo

        #endregion

        #region Eventos
        #region CasamentoAutomatico_AfterInitialize
        /// <summary>
        /// CasamentoAutomatico_AfterInitialize
        /// </summary>
        /// <param name="sender">object</param>
        /// <param name="e">RoutedEventArgs</param>
        private void CasamentoAutomatico_AfterInitialize(object sender, RoutedEventArgs e)
        {
            ShowUserWaitingProcess();
            
            _presenter.Inicializar();
            SelecionarDataCombo();

            HideUserWaitingProcess();
        }
        #endregion CasamentoAutomatico_AfterInitialize

        #region BtnExecutar_OnBufferedClick
        /// <summary>
        /// BtnExecutar_OnBufferedClick
        /// </summary>
        /// <param name="sender">object</param>
        /// <param name="e">RoutedEventArgs</param>
        /// <param name="clickCount">int</param>
        private void BtnExecutar_OnBufferedClick(object sender, RoutedEventArgs e, int clickCount)
        {
            ShowUserWaitingProcess();

            this.ClearServiceErrors();

            if (ChkCasamentoAutomatico.IsChecked.HasValue && ChkCasamentoAutomatico.IsChecked.Value)
                _presenter.ExecutarCasamentoAutomatico();

            else if (ChkCasamentoAutomaticoPreBoleto.IsChecked.HasValue && ChkCasamentoAutomaticoPreBoleto.IsChecked.Value)
                _presenter.ExecutarCasamentoAutomaticoPreBoleto();

            else if (ChkRecasamentoAutomatico.IsChecked.HasValue && ChkRecasamentoAutomatico.IsChecked.Value)
                _presenter.ExecutarRecasamentoAutomatico();

            HideUserWaitingProcess();
        }
        #endregion BtnExecutar_OnBufferedClick

        #region ChkCasamentoAutomaticoPreBoleto_Checked
        /// <summary>
        /// ChkCasamentoAutomaticoPreBoleto_Checked
        /// </summary>
        /// <param name="sender">object</param>
        /// <param name="e">RoutedEventArgs</param>
        private void ChkCasamentoAutomaticoPreBoleto_Checked(object sender, RoutedEventArgs e)
        {
            ApresentarCasamentoAutPreBoleto();
        }
        #endregion ChkCasamentoAutomaticoPreBoleto_Checked

        #region ChkCasamentoAutomatico_Checked
        /// <summary>
        /// ChkCasamentoAutomatico_Checked
        /// </summary>
        /// <param name="sender">object</param>
        /// <param name="e">RoutedEventArgs</param>
        private void ChkCasamentoAutomatico_Checked(object sender, RoutedEventArgs e)
        {
            ApresentarCasamentoAut();
        }
        #endregion ChkCasamentoAutomatico_Checked

        #region ChkRecasamentoAutomatico_Checked
        /// <summary>
        /// ChkRecasamentoAutomatico_Checked
        /// </summary>
        /// <param name="sender">object</param>
        /// <param name="e">RoutedEventArgs</param>
        private void ChkRecasamentoAutomatico_Checked(object sender, RoutedEventArgs e)
        {
            ApresentarRecasamentoAut();
        }
        #endregion ChkRecasamentoAutomatico_Checked


        #endregion

    }
}